package com.bd.scm.dao.mapper.timeCard;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bd.scm.domain.dto.timeCard.AttendanceCheckExportDto;
import com.bd.scm.domain.dto.timeCard.TimeCardDto;
import com.bd.scm.domain.dto.timeCard.TimecardClientDto;
import com.bd.scm.domain.models.timeCard.AttendanceCheckExport;
import com.bd.scm.domain.models.timeCard.TimeCard;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 考勤卡Mapper
 *
 * @ClassName TimeCardMapper
 * @Description TODO
 * @Author YH
 * @Date 2019/12/21 0021 10:32
 * @Version 1.0
 **/
public interface TimeCardMapper {

  /**
   * 考勤卡主要表格
   *
   * @param timeCardDto
   * @return
   */
  List<TimecardClientDto> findBdKqTimecard(TimeCardDto timeCardDto);

  /**
   * 个人加班页面主表格
   *
   * @param timeCardDto
   * @return
   */
  List<JSONObject> findTimecardJb(TimeCardDto timeCardDto);

  /**
   * 验证有效打卡记录条数是否小于2 如果小于2不可以补出勤
   *
   * @param timeCardDto userSerial 人员ID signBegin signEnd
   * @return
   */
  Integer findktJlCount(TimeCardDto timeCardDto);

  /**
   * 个人刷卡记录
   *
   * @param object 日期 signBegin signEnd  userSerial 人员ID
   * @return
   */
  List<JSONObject> findCardJl(JSONObject object);


  /**
   * 个人年假最新记录
   *
   * @param object date 日期  userSerial 人员ID
   * @return
   */
  List<JSONObject> findNjJl(JSONObject object);

  /**
   * 个人请假记录
   *
   * @param object date 日期  userSerial 人员ID
   * @return
   */
  List<JSONObject> findqingjJl(JSONObject object);

  /**
   * 修改刷卡记录状态
   *
   * @param timeCardDto ID主键 id  打卡状态  punchStatus 识别方式 recognitionWay
   * @return
   */
  int updateClockStatus(TimeCardDto timeCardDto);

  /**
   * 修改请假记录状态
   *
   * @param timeCardDto ID主键 id  状态  punchStatus  是否有假期额度 ishaveedu 1 2有额度  请假单号 orderId
   * @return
   */
  int updateQingjStatus(TimeCardDto timeCardDto);

  /**
   * 表格调休功能
   * 修改考勤卡数据 待确认工时 平时加班,周末加班,法定节假日加班,加班转补休 id
   *
   * @param timeCardDto
   * @return
   */
  int updateTimeCard1(TimeCardDto timeCardDto);

  /**
   * 统一加班 加班有效时长 公用
   * 获取考勤卡数据 根据ID
   *
   * @param timeCardDto id
   * @return id jiabanId
   */
  List<JSONObject> findTimeCard(TimeCardDto timeCardDto);

  /**
   * 统一加班 加班有效时长 公用
   * 修改考勤卡数据 id  加班类型  1 平时加班 2 周末加班 3 法定节假日加班 4 加班转补休
   *
   * @param jsonObject
   * @return
   */
  int updateTimeCard2(JSONObject jsonObject);

  /**
   * 根据orderId查询总流程
   *
   * @param timeCardDto 加班单ID orderId
   * @return
   */
  List<JSONObject> findTotalSteps(TimeCardDto timeCardDto);

  /**
   * 根据orderId查询当前流程
   *
   * @param timeCardDto 加班单ID orderId
   * @return
   */
  List<JSONObject> findSteps(TimeCardDto timeCardDto);

  /**
   * 获取该人员 日期调休年假最新一条请假单号
   * date 日期
   * userSerial 人员
   *
   * @param jsonObject
   * @return
   */
  String findQingjOrderId(JSONObject jsonObject);

  /**
   * startDate 开始日期
   * endDate 结束日期
   * user_serial, 多个人用","分隔
   *
   * @param jsonObject
   */
  void findTimecardExtend(JSONObject jsonObject);

  /**
   * 根据员工ID重新计算指定日期的考勤数据
   */
  void calculateByUserId(@Param("card") TimeCardDto timeCardDto);

  /**
   * 考勤封账
   *
   * @return
   */
  IPage<JSONObject> findAttendanceCheck(Page<JSONObject> page, @Param("param2") JSONObject object);

  /**
   * 导出考勤封账数据
   *
   * @param attendanceCheckExportDto
   * @return
   */
  List<AttendanceCheckExport> exportAttendanceCheck(@Param("param2") AttendanceCheckExportDto attendanceCheckExportDto);

  /**
   * 封账人员该月的异常数据
   *
   * @param timeCardDto id 人员ID  yearMonth 月份
   * @return
   */
  List<JSONObject> findAbnormalData(TimeCardDto timeCardDto);

  /**
   * 封账人员该月的未审批的请假数据
   *
   * @param timeCardDto userSerial 人员ID yearMonth 月份
   * @return
   */
  List<JSONObject> findKqingjData(TimeCardDto timeCardDto);

  /**
   * 封账人员该月的未审批的加班条数
   *
   * @param timeCardDto userSerial 人员ID yearMonth 月份
   * @return
   */
  int findJiabaCount(TimeCardDto timeCardDto);

  /**
   * 封账人员该月的未审批的加班数据
   *
   * @param timeCardDto userSerial 人员ID yearMonth 月份
   * @return
   */
  List<JSONObject> findJiaba(TimeCardDto timeCardDto);

  /**
   * 封账状态修改
   *
   * @param timeCardDto
   */
  void updateAttendanceCheck(TimeCardDto timeCardDto);

  /**
   * 执行考勤计算存储过程
   *
   * @param curDate 指定要计算的日期
   */
  void execCalculate(String calcDate);

  /**
   * 执行考勤计算存储过程
   *
   * @param timeCardDto userSerial 人员ID，date 日期
   */
  void execCalculate2(TimeCardDto timeCardDto);

  //请假取消功能

  /**
   * 5.判断请假单人数要不要减去 orderId  id  userSerial
   *
   * @param timeCardDto
   * @return
   */
  Integer findCount(TimeCardDto timeCardDto);

  /**
   * 6.修改请假单人数  总时长  根据单号 orderId hourage
   *
   * @param jsonObject
   * @return
   */
  void updateBdLeaveOrder(JSONObject jsonObject);

  /**
   * 根据ID获取记录
   *
   * @param ids 主键ID,用“，”隔开
   */
  List<TimecardClientDto> getListByIds(@Param(value = "ids") String ids);

  /**
   * 判断是否封账
   *
   * @param timeCardDto userSerial date
   * @return
   */
  int findAccountsCount(TimeCardDto timeCardDto);

  void execCalculatePeriod(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("users") String users, @Param("flag") int flag);

  /**
   * 获取员工指定日期的打卡数据
   * @param userId
   * @param cardDate
   * @return
   */
  TimeCard getTimeCard(@Param(value = "userId") Long userId, @Param(value = "cardDate")  String cardDate);
}
